# Тестовое задание для Ozon Fintech

## Что удалось реализовать
- Можно посмотреть список постов
- Можно посмотреть пост и комментарии
- Пользователь может ограничить комментарии
- Параметром в переменных окружения можно выбрать базу Postgres/cache

## На что не хватило времени, но следовало бы сделать
- Уровни логгирования. Сейчас очень много одинаковых логов
- Реализация пользователя для максимально комфортного использования системы комментариев
- Хорошая реализация API используя GraphQL (не хватило времени на изучение)
- Swagger
- Дописать тесты

## Что не удалось реализовать
- Отправка всего дерева комментариев в GraphQL. Как оказалось, GraphQL не умеет работать с рекурсией. Другого решения не нашел
- Рабочая версия приложения в Docker’е ;(

## Описание 

Чтобы реализовать систему ответов на комментарии, сделал у каждого коммента поле parent_id
,указывающее на родительский коммент.

Выглядит это следующим образом:

![image1.png](images%2Fimage1.png)

Для этого примера использовал рекурсивную функцию для вывода в консоль. 
Реализовать подобное в graphql resolver'е не удалось.

Если говорить о причнах по которым не реализовал некоторый основной функционал
, то выходит, что с самого начала увлекся архитектурой проекта и внедрением новых для себя методик

В любом случае с помощью этого небольшого проекта получил очень много новых знаний

Спасибо за возможность поработать над таким проектом

## Примеры запросов и ответов GraphQl

### Создание нового поста 

Запрос:
```
mutation {
    createPost(title: "Новый пост", content: "Содержимое поста", comments_enabled: true) {
        id
        title
        content
        comments_enabled
        created_at
    }
}
```

Ответ:
```
{
"data": {
    "createPost": {
        "comments_enabled": true,
        "content": "Содержимое поста",
        "created_at": "2024-05-27T00:34:17.881204+03:00",
        "id": 1,
        "title": "Новый пост"
        }
    }
}
```

### Создание комментария 

Запрос:
```
mutation {
    addComment(post_id: 1, content: "Это комментарий") {
        id
        post_id
        parent_id
        content
        created_at
    }
}
```

Ответ:
```
{
    "data": {
        "addComment": {
            "content": "Это комментарий",
            "created_at": "2024-05-27T00:37:34.281425+03:00",
            "id": 1,
            "parent_id": null,
            "post_id": 1
        }
    }
}
```

### Создание ответа к комментарию

Запрос:
```
mutation {
    addComment(post_id: 1, content: "Это ответ на коммент", parent_id: 1) {
        id
        post_id
        parent_id
        content
        created_at
    }
}
```

Ответ:
```
{
    "data": {
        "addComment": {
            "content": "Это ответ на коммент",
            "created_at": "2024-05-27T00:38:33.433369+03:00",
            "id": 2,
            "parent_id": 1,
            "post_id": 1
        }
    }
}
```


### Получить пост с комментариями и ответами 

Запрос:
```
query {
  post(id: 1) {
    post {
      id
      title
      content
      comments_enabled
      created_at
    }
    comments {
      id
      post_id
      parent_id
      content
      created_at    
      replies {
        id
        post_id
        parent_id
        content
        created_at
        replies {
            id
            post_id
            parent_id
            content
            created_at
        }
      }
    }
  }
}
```

Ответ:
```
{
    "data": {
        "post": {
            "comments": [
                {
                    "content": "Это комментарий",
                    "created_at": "2024-05-27T00:37:34.281425+03:00",
                    "id": 1,
                    "parent_id": null,
                    "post_id": 1,
                    "replies": [
                        {
                            "content": "Это ответ на коммент",
                            "created_at": "2024-05-27T00:38:33.433369+03:00",
                            "id": 2,
                            "parent_id": 1,
                            "post_id": 1,
                            "replies": []
                        }
                    ]
                }
            ],
            "post": {
                "comments_enabled": true,
                "content": "Содержимое поста",
                "created_at": "2024-05-27T00:34:17.881204+03:00",
                "id": 1,
                "title": "Новый пост"
            }
        }
    }
}
```




